<?php
namespace Modules\Box\Entities;

use Modules\Core\Entities\BaseEntity as Model;
use Modules\Order\Traits\Skuable;
use Setting;
use Cache;

class BoxSku extends Model
{
	use Skuable;
	
	protected $guarded = ['sales'];
    static public $resourcename = '小盒子';

    public $options;
    public $openIndex;
    public $openIndexs;

    protected $casts = [
        'assets' => 'json',
        'open_indexs' => 'json',
        'detail_images' => 'json'
    ];

    // 上级商品
    public function parent_product()
    {
        return $this->belongsTo('\Modules\Box\Entities\Box', 'box_id');
    }

    public function box()
    {
    	return $this->belongsTo('\Modules\Box\Entities\Box', 'box_id');
    }

    // 可进行兑换的碎片
    public function chip()
    {
        return $this->belongsTo('\Modules\Chip\Entities\Chip', 'chip_id');
    }

    public function scopeType($query, $type)
    {
        $map = [
            'normal' => 0,
            'hidden' => 1
        ];
        return $query->where('type', $map[$type]);
    }

    public function getBrotherBoxes($total)
    {
    	if ($total > 1)
    		return self::where('box_id', $this->box_id)->where('id', '<>', $this->id)->inRandomOrder()->take($total)->get();
   		else
    		return self::where('box_id', $this->box_id)->where('id', '<>', $this->id)->inRandomOrder()->first();
    }

    // 获取免费摇一摇排队sku
    public function getExcludedSkuByFreeTips($count)
    {
        return self::where('box_id', $this->box_id)->where('id', '<>', $this->id)->orderBy('stock', 'desc')->skip($count)->first();

        // return $list->random()->first();
    }

    // 返回商品类型
    // public function getProductType()
    // {
    //     return 'box';
    // }

    // public function getSkuType()
    // {
    //     return NULL;
    // }

    public function getAttrs()
    {
        return [
            [
                'k' => '编号',
                'v' => $this->number
            ]
        ];
    }

    // 获取原价
    public function getOriginalPrice($type = 'money')
    {
        if ($this->money_price || $this->score_price) {
            if ($type == 'money') {
                return $this->money_price;
            }
            elseif ($type == 'score') {
                return $this->score_price;
            }
        }
        else {
            if ($type == 'money') {
                return $this->box->money_price;
            }
            elseif ($type == 'score') {
                return $this->box->score_price;
            }
        }
    }

    // // 递归函数
    // public function calcFun($options) {

    //     // 此盒总销量次数
    //     $sales = $options['box_total_sales'];

    //     // 此sku最后的销量次数
    //     $lastSaleIndex = $options['last_sale_index'];

    //     // 总共需要打开的次数
    //     $totalOpenTimes = $options['total_open_times'];

    //     // 设置的每抽多少次出1个
    //     $distance = $options['distance'];

    //     // 此次是否开出隐藏款
    //     $isOpen = 0;

    //     $sales += 1;
    //     $totalOpenTimes -= 1;


    //     // 超出最长距离
    //     $lastArea = $lastSaleIndex ? floor($lastSaleIndex / $distance) : -1;
    //     $currentArea = floor($sales / $distance);
    //     $nextArea = floor(($sales + 1) / $distance);
    //     // \Log::error($sales . ' + ' . $lastArea . ' +  '  . $currentArea);

    //     if (($currentArea - $lastArea > 1) || ($nextArea - $lastArea > 1)) {
    //         // 已超出最长距离，必出
    //         $isOpen = 1;
    //         $lastSaleIndex = $sales;
    //     }
    //     elseif ($currentArea - $lastArea === 1) {
    //         // 已越出上一次开出的区间，可以进行随机开盒
    //         if (rand(1, $distance) === 1) {
    //             // 未到达边界最高，需要随机
    //             $isOpen = 1;
    //             $lastSaleIndex = $sales;
    //         }
    //     }

    //     // 进行其它开盒
    //     if ($totalOpenTimes > 0) {

    //         $options['box_total_sales'] = $sales;
    //         $options['last_sale_index'] = $lastSaleIndex;
    //         $options['total_open_times'] = $totalOpenTimes;

    //         return $isOpen + $this->calcFun($options);
    //     }
    //     else {
    //         return $isOpen;
    //     }
    // }

    // // 计算在连抽 $totalOpenTimes 次情况下应该出现多少次此隐藏款
    // public  function calcHiddenOpenTimes($totalOpenTimes) 
    // {
    //     // 下架或者库存不足
    //     if ($this->isOffStock() || $this->stock < 0) 
    //     {
    //         return 0;
    //     }

    //     // 未设置概率或概率为0
    //     if (!$this->probability)
    //     {
    //         return 0;
    //     }

    //     $times = $this->calcFun([
    //         'box_total_sales' => $this->box->sales,
    //         'last_sale_index' => $this->last_sales_index ?: 0,
    //         'total_open_times' => $totalOpenTimes,
    //         'distance' => $this->probability
    //     ]);

    //     // 每次连抽只可以开出一个隐藏款
    //     $times = $times >= 1 ? 1 : 0;

    //     return $times;
    // }

    // 检查此隐藏款是否可以在某个序号段内开出
    // $start为此盲盒起始抽取序号，从1开始算起
    public function canOpenHiddenSkuInRange($start, $end)
    {
        // 开奖间隔
        $distance = $this->probability;

        // \Log::error('haha');

        // 无法开出
        if (!$distance) {
            return false;
        }

        // 最后一次开出
        $openIndexs = $this->open_indexs ?: [];
        $lastArea = ceil((end($openIndexs) ?: 0) / $distance);  // 最后一次开出隐藏款的区间

        $temp = ceil($this->box->open_index / $distance) - 1;    // 上次普通开奖区间
        $lastArea = $temp > $lastArea ? $temp : $lastArea;

        $nextEnd = ($lastArea + 1) * $distance;
        $nextStart = floor($nextEnd - $distance * 0.5);

        // 当前区间已开过
        if (Cache::get($this->box_id . '_' . $nextStart)) {
            return false;
        }

        // \Log::error('上次开出');
        // \Log::error('下次开出的起点与终点:' . $nextStart . ' ==> ' . $nextEnd);

        // 必不开
        if ($end < $nextStart || $start > $nextEnd) {
            return false;
        }

        // 必开
        if ($end >= $nextEnd) {

            // 缓存此区间已开出隐藏款
            Cache::put($this->box_id . '_' . $nextStart, 1, 180);

            return rand($nextStart >= $start ? $nextStart : $start, $nextEnd);
        }

        // 剩下在区间内随机开
        $randStart = $nextStart >= $start ? $nextStart : $start;
        $randEnd =  $end;

        // 随机 1/2 是否中
        for ($i = $randStart; $i <= $randEnd; $i ++) {
            if (rand(1, intVal($distance * 0.5)) <= 2) {

                // 缓存此区间已开出隐藏款
                Cache::put($this->box_id . '_' . $nextStart, 1, 180);
                return $i;
            } 
        }

        return false;
    }

    // 计算概率
    public function calcOdds()
    {
        // 隐藏款
        if ($this->isSpecialSku()) {
            if (!$this->probability) {
                return 0;
            }
            return round(100 / $this->probability, 3);
        }
        else {
            return $this->odds;
        }
    }

    public function isHiddenSku()
    {
        return $this->type === 1;
    }

    public function isSpecialSku()
    {
        return $this->type === 1;
    }

    public function isNeedAddress()
    {
    	return false;
    }

    public function getChipCoverStatus()
    {
        return $this->chip_status;
    }

    public function getSetting($type)
    {
        return @Setting::get('sys_box') ?: [];
    }


    // public function updateSalesSync()
    // {
    //     // $this->box->updateSalesAndStock();
    // }
}
